/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manejadores;

import com.akcess.exception.*;
import com.akcess.vo.*;
import com.akcess.impl.*;
import com.akcess.dao.*;
import java.sql.*;
import java.util.*;

/**
 *Esta clase se utiliza para realizar las tareas relacionadas con la gestion de los Recursos Humanos,
 * como creacion, borrado y modificacion de Recursos Humanos, entre otras cosas.
 * @author Alejandro
 */
public class ManejadorRecursosHumanos {

    private Connection conexion = null;

    /**
     * Constructor de la Clase ManejadorRecursosHumanos que recibe una conexion a la BD.
     * @param con Conexion a la BD, el cual se utilizara como el unico atributo de esta clase. (Connection conexion)
     */
    public ManejadorRecursosHumanos(Connection con) {
        this.conexion = con;
    }

    /**
     * Crea un Recurso y un Recurso Humano determinado en la BD.
     * @param recurso Es un objeto de tipo Recurso que contiene los datos del nuevo Recurso.
     * @param recursoHumano contiene los datos del nuevo Recurso Humano agregado. 
     * @throws com.akcess.exception.Recurso_humanoException Lanza excepciones del tipo Recurso_humanoException, creada por el DAOGenerator.
     */
    public void CrearRecursoHumano(Recurso recurso, Recurso_humano recursoHumano) throws Recurso_humanoException {
        try {

            int id_nuevoRecurso = 0;

            //Primero agregamos el nuevo recurso en la Tabla Recurso.
            RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
            RecursoRecordCountDAOImpl manejadorContador = new RecursoRecordCountDAOImpl();
            RecursoRecordCount contador = manejadorContador.getRecordCount(this.conexion);
            int cantRegistros = contador.getCount();
            id_nuevoRecurso = 1 + cantRegistros;
            recurso.setId_recurso((long)id_nuevoRecurso);
            manejadorRecurso.insert(recurso, this.conexion);

            //Ahora agregamos el recurso nuevo a la tabla Recurso_humano.
            Recurso_humanoDAOImpl manejadorRecursoHumano = new Recurso_humanoDAOImpl();
            recursoHumano.setId_recurso(id_nuevoRecurso);
            manejadorRecursoHumano.insert(recursoHumano, this.conexion);
        } catch (Recurso_humanoException ex) {
            ex.printStackTrace();
        } catch (RecursoException ex) {
            ex.printStackTrace();
        } catch (RecursoRecordCountException ex) {
            ex.printStackTrace();
        }

    }

    /**
     * Realiza las modificaciones en la BD que fueron realizadas sobre un Recurso Humano determinado, realizando las modificaciones
     * en las Tablas Recurso y Recurso_humano.
     * @param recurso Representa el Recurso en la tabla Recurso que fue modificado.     
     * @param recursoHumano Representa el Recurso Humano en la tabla Recurso_humano que fue modificado.
     * @throws com.akcess.exception.Recurso_humanoException Lanza excepciones del tipo Recurso_humanoException, creada por el DAOGenerator.
     */
    public void ModificarRecursoHumano(Recurso recurso, Recurso_humano recursoHumano) throws Recurso_humanoException {
        try {
            Recurso_humanoDAOImpl manejadorRecursoHumano = new Recurso_humanoDAOImpl();
            Recurso_humanoPK recursoHumanoPK = new Recurso_humanoPK();
            recursoHumanoPK.setId_recurso(recurso.getId_recurso());
            manejadorRecursoHumano.update(recursoHumanoPK, recursoHumano, this.conexion);

            RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
            RecursoPK recursoPK = new RecursoPK();
            recursoPK.setId_recurso(recurso.getId_recurso());
            Recurso recursoOriginal = manejadorRecurso.findByPrimaryKey(recursoPK, this.conexion);
            recurso.setBorrado(recursoOriginal.getBorrado());
            recurso.setFechacreacion(recursoOriginal.getFechacreacion());
            manejadorRecurso.update(recursoPK, recurso, this.conexion);
        } catch (Recurso_humanoException ex) {
            ex.printStackTrace();
        } catch (RecursoException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Obtiene todos los Recursos Humanos existentes en la BD.
     * @return Un vector de tipo RecursoHumanoCompleto, que contiene toda la informacion de cada Recurso Humano.
     * @throws com.akcess.exception.Recurso_humanoException Lanza excepciones del tipo Recurso_humanoException, creada por el DAOGenerator.
     */
    public RecursoHumanoCompleto[] ListarRecursosHumanos() throws Recurso_humanoException {
        RecursoHumanoCompleto[] recursos = null;
        try {
            Recurso_humanoDAOImpl recursoDAO = new Recurso_humanoDAOImpl();
            recursos = recursoDAO.ObtenerRecursoCompleto(this.conexion);
        } catch (Recurso_humanoException ex) {
            ex.printStackTrace();
        }
        return recursos;
    }

    /**
     * Realiza el borrado de la BD de un Recurso Humano determinado.
     * @param idRecurso Contiene el id del Recurso que sera eliminado o borrado logicamente.
     * @throws com.akcess.exception.RecursoException Lanza excepciones del tipo RecursoException, creada por el DAOGenerator.
     */
    public void BorrarRecursoHumano(int idRecurso) throws RecursoException {
        //Me conecto a la BD           
        try {
            //Borramos logicamente de la Tabla Recurso_humano.
            RecursoPK recursoPK = new RecursoPK();
            recursoPK.setId_recurso(idRecurso);
            RecursoDAOImpl manejadorRecurso = new RecursoDAOImpl();
            Recurso recurso = manejadorRecurso.findByPrimaryKey(recursoPK, this.conexion);
            recurso.setBorrado(true);
            manejadorRecurso.update(recursoPK, recurso, this.conexion);
            
            //Borramos las filas de la tabla Tiene_encargados que contienen el mismo id del Recurso Humano que se esta Borrando.
            Tiene_encargadosDAOImpl manejadorEncargados = new Tiene_encargadosDAOImpl();
            manejadorEncargados.borrarXidEncargado((long)idRecurso, this.conexion);
        } catch (RecursoException ex) {
            ex.printStackTrace();
        }catch (Tiene_encargadosException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Obtiene de la BD un Recurso Humano determinado por un id de recurso.
     * @return El Recurso Humano especificado por idRecurso.
     * @param idRecurso Contiene el id del Recurso que debera ser buscado.
     * @throws com.akcess.exception.Recurso_humanoException Lanza excepciones del tipo Recurso_humanoException, creada por el DAOGenerator.
     */
    public RecursoHumanoCompleto ObtenerRecursoHumano(int idRecurso) throws Recurso_humanoException {
        //Me conecto a la BD                   
        Recurso_humanoDAOImpl manejadorRecurso = new Recurso_humanoDAOImpl();
        RecursoHumanoCompleto recurso = manejadorRecurso.EncontrarRecursoCompleto(idRecurso, this.conexion);
        return recurso;
    }
}
